<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    function create(fn, ...args) {
        // 1.先创建一个空对象
        var obj = {}
        // 2.把空对象和构造函数通过原型链进行链接
        // 方法一：obj.__proto__ = fn.prototype
        // 方法二
        Object.setPrototypeOf(obj, fn.prototype)
        // 3.把构造函数的this绑定到新的空对象身上
        var result = fn.apply(obj, args)
        //apply 作用：用于改变this的指向,第一个参数为你要传入的对象，传入后函数的this就指向了这个对象,后面的参数为你为函数传递的参数值。

        // 4.根据构造函数返回的类型,进行返回值的处理判断
        return result instanceof Object ? result : obj
    }
    function Fne(name, age) {
        this.name = name;
        this.age = age 
    }
    Fne.prototype.say = function () {
        console.log("我喜欢唱歌");
    }
    Fne.sex = function () {
        console.log("我是个学生");
    }
    const func = create(Fne, '小姑娘', 11)
    func.say()
    Fne.sex()
    console.log(func);

    const newfn = new Fne('jessica', 55)
    console.log(newfn);

</script>

</html>